#!/bin/bash

# Java Decompiler MCP Service Launcher
# 统一启动HTTP服务器和代理服务器

set -e

SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd "$SCRIPT_DIR"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# PID文件路径
HTTP_PID_FILE="$SCRIPT_DIR/.http-server.pid"
PROXY_PID_FILE="$SCRIPT_DIR/.proxy-server.pid"

# 日志文件路径
LOG_DIR="$SCRIPT_DIR/logs"
HTTP_LOG="$LOG_DIR/http-server.log"
PROXY_LOG="$LOG_DIR/proxy-server.log"

# 创建日志目录
mkdir -p "$LOG_DIR"

# 函数：打印带颜色的消息
print_msg() {
    echo -e "${2}${1}${NC}"
}

# 函数：检查Node.js
check_node() {
    if ! command -v node &> /dev/null; then
        print_msg "❌ Node.js 未安装，请先安装 Node.js 18+" "$RED"
        exit 1
    fi
    print_msg "✅ Node.js 已安装: $(node --version)" "$GREEN"
}

# 函数：检查依赖
check_dependencies() {
    if [ ! -d "node_modules" ]; then
        print_msg "📦 安装依赖..." "$YELLOW"
        npm install
    fi
    
    if [ ! -d "dist" ]; then
        print_msg "🔨 编译TypeScript..." "$YELLOW"
        npm run build
    fi
}

# 函数：停止服务
stop_services() {
    print_msg "🛑 停止现有服务..." "$YELLOW"
    
    # 停止HTTP服务器
    if [ -f "$HTTP_PID_FILE" ]; then
        PID=$(cat "$HTTP_PID_FILE")
        if ps -p $PID > /dev/null 2>&1; then
            kill $PID 2>/dev/null || true
            print_msg "  - HTTP服务器已停止 (PID: $PID)" "$GREEN"
        fi
        rm -f "$HTTP_PID_FILE"
    fi
    
    # 停止代理服务器
    if [ -f "$PROXY_PID_FILE" ]; then
        PID=$(cat "$PROXY_PID_FILE")
        if ps -p $PID > /dev/null 2>&1; then
            kill $PID 2>/dev/null || true
            print_msg "  - 代理服务器已停止 (PID: $PID)" "$GREEN"
        fi
        rm -f "$PROXY_PID_FILE"
    fi
    
    # 清理可能残留的进程
    pkill -f "mcp-http-server" 2>/dev/null || true
    pkill -f "mcp-proxy" 2>/dev/null || true
    
    sleep 1
}

# 函数：启动HTTP服务器
start_http_server() {
    print_msg "🚀 启动HTTP服务器..." "$BLUE"
    
    # 启动HTTP服务器并保存PID（增加内存限制）
    nohup node --max-old-space-size=4096 dist/mcp-http-server.js > "$HTTP_LOG" 2>&1 &
    HTTP_PID=$!
    echo $HTTP_PID > "$HTTP_PID_FILE"
    
    # 等待服务器启动
    sleep 2
    
    # 检查服务器是否正常运行
    if ps -p $HTTP_PID > /dev/null 2>&1; then
        print_msg "✅ HTTP服务器已启动 (PID: $HTTP_PID)" "$GREEN"
        
        # 尝试健康检查
        if command -v curl &> /dev/null; then
            if curl -s http://localhost:3000/health > /dev/null 2>&1; then
                print_msg "✅ HTTP服务器健康检查通过" "$GREEN"
            else
                print_msg "⚠️  HTTP服务器已启动但健康检查失败" "$YELLOW"
            fi
        fi
    else
        print_msg "❌ HTTP服务器启动失败，查看日志: $HTTP_LOG" "$RED"
        tail -n 20 "$HTTP_LOG"
        exit 1
    fi
}

# 函数：启动代理服务器
start_proxy_server() {
    print_msg "🚀 启动代理服务器..." "$BLUE"
    
    # 启动代理服务器并保存PID
    nohup node dist/mcp-proxy.js > "$PROXY_LOG" 2>&1 &
    PROXY_PID=$!
    echo $PROXY_PID > "$PROXY_PID_FILE"
    
    # 等待服务器启动
    sleep 2
    
    # 检查服务器是否正常运行
    if ps -p $PROXY_PID > /dev/null 2>&1; then
        print_msg "✅ 代理服务器已启动 (PID: $PROXY_PID)" "$GREEN"
    else
        print_msg "❌ 代理服务器启动失败，查看日志: $PROXY_LOG" "$RED"
        tail -n 20 "$PROXY_LOG"
        exit 1
    fi
}

# 函数：显示服务状态
show_status() {
    echo ""
    print_msg "=== 服务状态 ===" "$BLUE"
    
    # HTTP服务器状态
    if [ -f "$HTTP_PID_FILE" ]; then
        PID=$(cat "$HTTP_PID_FILE")
        if ps -p $PID > /dev/null 2>&1; then
            print_msg "HTTP服务器: 运行中 (PID: $PID)" "$GREEN"
            print_msg "  地址: http://localhost:3000" "$NC"
            print_msg "  健康检查: http://localhost:3000/health" "$NC"
            print_msg "  日志: $HTTP_LOG" "$NC"
        else
            print_msg "HTTP服务器: 已停止" "$RED"
        fi
    else
        print_msg "HTTP服务器: 未运行" "$YELLOW"
    fi
    
    echo ""
    
    # 代理服务器状态
    if [ -f "$PROXY_PID_FILE" ]; then
        PID=$(cat "$PROXY_PID_FILE")
        if ps -p $PID > /dev/null 2>&1; then
            print_msg "代理服务器: 运行中 (PID: $PID)" "$GREEN"
            print_msg "  协议: stdio -> HTTP" "$NC"
            print_msg "  日志: $PROXY_LOG" "$NC"
        else
            print_msg "代理服务器: 已停止" "$RED"
        fi
    else
        print_msg "代理服务器: 未运行" "$YELLOW"
    fi
}

# 函数：显示使用说明
show_usage() {
    echo "使用方法: $0 [command]"
    echo ""
    echo "命令:"
    echo "  start    - 启动所有服务（默认）"
    echo "  stop     - 停止所有服务"
    echo "  restart  - 重启所有服务"
    echo "  status   - 显示服务状态"
    echo "  logs     - 显示服务日志"
    echo "  help     - 显示此帮助信息"
}

# 函数：显示日志
show_logs() {
    print_msg "=== HTTP服务器日志 ===" "$BLUE"
    tail -n 20 "$HTTP_LOG" 2>/dev/null || echo "无日志"
    echo ""
    print_msg "=== 代理服务器日志 ===" "$BLUE"
    tail -n 20 "$PROXY_LOG" 2>/dev/null || echo "无日志"
}

# 主逻辑
main() {
    case "${1:-start}" in
        start)
            print_msg "🔧 Java Decompiler MCP Service Launcher" "$BLUE"
            print_msg "========================================" "$BLUE"
            
            check_node
            check_dependencies
            stop_services
            start_http_server
            start_proxy_server
            show_status
            
            echo ""
            print_msg "✅ 所有服务已成功启动!" "$GREEN"
            print_msg "📋 使用 '$0 status' 查看服务状态" "$NC"
            print_msg "📋 使用 '$0 logs' 查看服务日志" "$NC"
            print_msg "📋 使用 '$0 stop' 停止所有服务" "$NC"
            ;;
            
        stop)
            stop_services
            print_msg "✅ 所有服务已停止" "$GREEN"
            ;;
            
        restart)
            $0 stop
            sleep 2
            $0 start
            ;;
            
        status)
            show_status
            ;;
            
        logs)
            show_logs
            ;;
            
        help)
            show_usage
            ;;
            
        *)
            print_msg "❌ 无效命令: $1" "$RED"
            echo ""
            show_usage
            exit 1
            ;;
    esac
}

# 捕获退出信号
trap 'stop_services; exit' INT TERM

# 执行主逻辑
main "$@"